home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
DJGPP
/
CBGRX103.ZIP
/
contrib
/
libgrx
/
src
/
bytedraw.h
< prev
next >
Wrap
Text File
|
1993-12-06
|
17KB
|
463 lines
/**
** BYTEDRAW.H
**
** Copyright (C) 1992, Csaba Biegl
** 820 Stirrup Dr, Nashville, TN, 37221
** csaba@vuse.vanderbilt.edu
**
** This file is distributed under the terms listed in the document
** "copying.cb", available from the author at the address above.
** A copy of "copying.cb" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.cb".
** You should also have received a copy of the GNU General Public
** License along with this program (it is in the file "copying");
** if not, write to the Free Software Foundation, Inc., 675 Mass Ave,
** Cambridge, MA 02139, USA.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**/
#ifndef _BYTEDRAW_H_
#define _BYTEDRAW_H_
#ifdef __TURBOC__
#pragma inline
#endif
/*
* utilities -- other files may define them too
*/
#ifndef _SaveDS
#ifdef __TURBOC__
#define _ClrDir() asm cld
#define _SetDir() asm std
#define _SaveDS() asm push ds
#define _RestoreDS() asm pop ds
#endif
#ifdef __GNUC__
#define _ASV asm volatile
#define _ClrDir() _ASV("cld")
#define _SetDir() _ASV("std")
#define _SaveDS()
#define _RestoreDS()
#endif
#endif /* _SaveDS */
#ifdef __TURBOC__
/*
* display a bit mapped font character (both FGC and BGC)
*/
#define __WRTFONT__(dst,offs,fontbits,wdt,hgt,colors,putbyte) do { \
_BX = hgt; \
_DX = colors; \
asm les di,DWORD PTR dst; \
asm lds si,DWORD PTR fontbits; \
Font##putbyte##NextRow: \
asm mov cx,WORD PTR wdt; \
Font##putbyte##ReadBits: \
asm lodsb; \
asm mov ah,al; \
asm stc; \
asm adc ah,ah; \
Font##putbyte##Loop: \
asm sbb al,al; \
asm and al,dh; \
asm xor al,dl; \
putbyte; \
asm add ah,ah; \
asm loopnz Font##putbyte##Loop; \
asm or cx,cx; \
asm jnz Font##putbyte##ReadBits; \
asm add di,WORD PTR offs; \
asm dec bx; \
asm jnz Font##putbyte##NextRow; \
} while(0)
/*
* display a bit mapped font character (FGC or BGC only)
*/
#define __WR1CFNT__(dst,offs,fontbits,wdt,hgt,color,jump,opr) do { \
_BX = hgt; \
_DL = color; \
asm les di,DWORD PTR dst; \
asm lds si,DWORD PTR fontbits; \
Font##jump##opr##NextRow: \
asm mov cx,WORD PTR wdt; \
Font##jump##opr##ReadBits: \
asm lodsb; \
asm stc; \
asm adc al,al; \
Font##jump##opr##Loop: \
asm jump Font##jump##opr##NoSet; \
asm opr BYTE PTR es:[di],dl; \
Font##jump##opr##NoSet: \
asm inc di; \
asm add al,al; \
asm loopnz Font##jump##opr##Loop; \
asm or cx,cx; \
asm jnz Font##jump##opr##ReadBits; \
asm add di,WORD PTR offs; \
asm dec bx; \
asm jnz Font##jump##opr##NextRow; \
} while(0)
#define __WFSET__ asm stosb
#define __WFXOR__ asm xor BYTE PTR es:[di],al; asm inc di
#define __WFOR__ asm or BYTE PTR es:[di],al; asm inc di
#define __WFAND__ asm and BYTE PTR es:[di],al; asm inc di
#define _WriteFont(dp,o,bp,w,h,cls) __WRTFONT__(dp,o,bp,w,h,cls,__WFSET__)
#define _WriteFontXor(dp,o,bp,w,h,cls) __WRTFONT__(dp,o,bp,w,h,cls,__WFXOR__)
#define _WriteFontOr(dp,o,bp,w,h,cls) __WRTFONT__(dp,o,bp,w,h,cls,__WFOR__)
#define _WriteFontAnd(dp,o,bp,w,h,cls) __WRTFONT__(dp,o,bp,w,h,cls,__WFAND__)
#define _WrFGCFont(dp,o,bp,w,h,fg) __WR1CFNT__(dp,o,bp,w,h,fg,jnc,mov)
#define _WrFGCFontXor(dp,o,bp,w,h,fg) __WR1CFNT__(dp,o,bp,w,h,fg,jnc,xor)
#define _WrFGCFontOr(dp,o,bp,w,h,fg) __WR1CFNT__(dp,o,bp,w,h,fg,jnc,or)
#define _WrFGCFontAnd(dp,o,bp,w,h,fg) __WR1CFNT__(dp,o,bp,w,h,fg,jnc,and)
#define _WrBGCFont(dp,o,bp,w,h,bg) __WR1CFNT__(dp,o,bp,w,h,bg,jc,mov)
#define _WrBGCFontXor(dp,o,bp,w,h,bg) __WR1CFNT__(dp,o,bp,w,h,bg,jc,xor)
#define _WrBGCFontOr(dp,o,bp,w,h,bg) __WR1CFNT__(dp,o,bp,w,h,bg,jc,or)
#define _WrBGCFontAnd(dp,o,bp,w,h,bg) __WR1CFNT__(dp,o,bp,w,h,bg,jc,and)
/*
* set a bitmap patterned row
*/
#define __PTNROW__(dst,maskpatt,width,colors,putbyte) do { \
_DX = maskpatt; \
_CX = width; \
_BX = colors; \
asm les di,DWORD PTR dst; \
asm sub bl,bh; \
Patt##putbyte##Loop: \
asm rol dl,1; \
asm sbb al,al; \
asm and al,bh; \
asm xor al,bl; \
putbyte; \
asm loop Patt##putbyte##Loop; \
} while(0)
/*
* set a bitmap patterned row, foreground only
*/
#define __P1CROW__(dst,maskpatt,width,color,jump,opr) do { \
_DX = maskpatt; \
_CX = width; \
_AX = color; \
asm les di,DWORD PTR dst; \
Patt##jump##opr##Loop: \
asm rol dl,1; \
asm jump Patt##jump##opr##NoSet; \
asm opr BYTE PTR es:[di],al; \
Patt##jump##opr##NoSet: \
asm inc di; \
asm loop Patt##jump##opr##Loop; \
} while(0)
#define _PatternSet(dst,msk,wdt,cls) __PTNROW__(dst,msk,wdt,cls,__WFSET__)
#define _PatternXor(dst,msk,wdt,cls) __PTNROW__(dst,msk,wdt,cls,__WFXOR__)
#define _PatternOr(dst,msk,wdt,cls) __PTNROW__(dst,msk,wdt,cls,__WFOR__)
#define _PatternAnd(dst,msk,wdt,cls) __PTNROW__(dst,msk,wdt,cls,__WFAND__)
#define _PattFGCSet(dst,msk,wdt,fg) __P1CROW__(dst,msk,wdt,fg,jnc,mov)
#define _PattFGCXor(dst,msk,wdt,fg) __P1CROW__(dst,msk,wdt,fg,jnc,xor)
#define _PattFGCOr(dst,msk,wdt,fg) __P1CROW__(dst,msk,wdt,fg,jnc,or)
#define _PattFGCAnd(dst,msk,wdt,fg) __P1CROW__(dst,msk,wdt,fg,jnc,and)
#define _PattBGCSet(dst,msk,wdt,bg) __P1CROW__(dst,msk,wdt,bg,jc,mov)
#define _PattBGCXor(dst,msk,wdt,bg) __P1CROW__(dst,msk,wdt,bg,jc,xor)
#define _PattBGCOr(dst,msk,wdt,bg) __P1CROW__(dst,msk,wdt,bg,jc,or)
#define _PattBGCAnd(dst,msk,wdt,bg) __P1CROW__(dst,msk,wdt,bg,jc,and)
/*
* X major line drawing
*/
#define __XLINE__(dst,offs,deltx,delty,color,putbyte) do { \
_CX = deltx; \
_BX = delty; \
_AX = color; \
_SI = offs; \
asm les di,dst; \
asm mov dx,cx; \
asm shr dx,1; \
asm inc cx; \
LineX##putbyte##Loop: \
putbyte; \
asm sub dx,bx; \
asm jnc LineX##putbyte##NoAdjust; \
asm add dx,WORD PTR deltx; \
asm add di,si; \
LineX##putbyte##NoAdjust: \
asm loop LineX##putbyte##Loop; \
} while(0)
#define __XLSET__ asm stosb
#define __XLXOR__ asm xor BYTE PTR es:[di],al; asm inc di
#define __XLOR__ asm or BYTE PTR es:[di],al; asm inc di
#define __XLAND__ asm and BYTE PTR es:[di],al; asm inc di
#define _DrawXLine(dp,do,dx,dy,c) __XLINE__(dp,do,dx,dy,c,__XLSET__)
#define _DrawXLineXor(dp,do,dx,dy,c) __XLINE__(dp,do,dx,dy,c,__XLXOR__)
#define _DrawXLineOr(dp,do,dx,dy,c) __XLINE__(dp,do,dx,dy,c,__XLOR__)
#define _DrawXLineAnd(dp,do,dx,dy,c) __XLINE__(dp,do,dx,dy,c,__XLAND__)
/*
* Y major line drawing
*/
#define __YLINE__(dst,offs,deltx,delty,color,putbyte) do { \
_CX = delty; \
_BX = deltx; \
_AX = color; \
_SI = offs; \
asm les di,dst; \
asm mov dx,cx; \
asm shr dx,1; \
asm inc cx; \
LineY##putbyte##Loop: \
putbyte; \
asm add di,si; \
asm sub dx,bx; \
asm jnc LineY##putbyte##NoAdjust; \
asm add dx,WORD PTR delty; \
asm inc di; \
LineY##putbyte##NoAdjust: \
asm loop LineY##putbyte##Loop; \
} while(0)
#define __YLSET__ asm mov BYTE PTR es:[di],al
#define __YLXOR__ asm xor BYTE PTR es:[di],al
#define __YLOR__ asm or BYTE PTR es:[di],al
#define __YLAND__ asm and BYTE PTR es:[di],al
#define _DrawYLine(dp,do,dx,dy,c) __YLINE__(dp,do,dx,dy,c,__YLSET__)
#define _DrawYLineXor(dp,do,dx,dy,c) __YLINE__(dp,do,dx,dy,c,__YLXOR__)
#define _DrawYLineOr(dp,do,dx,dy,c) __YLINE__(dp,do,dx,dy,c,__YLOR__)
#define _DrawYLineAnd(dp,do,dx,dy,c) __YLINE__(dp,do,dx,dy,c,__YLAND__)
#endif /* __TURBOC__ */
#ifdef __GNUC__
/*
* display a bit mapped font character (both FGC and BGC)
*/
#define __WRTFONT__(dst,offs,bits,wdt,hgt,colors,putbyte) _ASV(" \n\
movl %0,%%edi \n\
movl %2,%%esi \n\
movl %4,%%ebx \n\
movl %5,%%edx \n\
L_Font"#putbyte"NextRow: \n\
movl %3,%%ecx \n\
L_Font"#putbyte"ReadBits: \n\
lodsb \n\
movb %%al,%%ah \n\
stc \n\
adcb %%ah,%%ah \n\
L_Font"#putbyte"Loop: \n\
sbbb %%al,%%al \n\
andb %%dh,%%al \n\
xorb %%dl,%%al \n\
"putbyte" \n\
addb %%ah,%%ah \n\
loopnz L_Font"#putbyte"Loop \n\
orl %%ecx,%%ecx \n\
jnz L_Font"#putbyte"ReadBits \n\
addl %1,%%edi \n\
decl %%ebx \n\
jnz L_Font"#putbyte"NextRow "\
: /* NOTHING */ \
: "g" (dst), "g" (offs), "g" (bits), \
"g" (wdt), "g" (hgt), "g" (colors) \
: "di", "si", "dx", "cx", "bx", "ax" \
)
/*
* display a bit mapped font character (FGC or BGC only)
*/
#define __WR1CFNT__(dst,offs,bits,wdt,hgt,color,jump,opr) _ASV(" \n\
movl %0,%%edi \n\
movl %2,%%esi \n\
movl %4,%%ebx \n\
movl %5,%%edx \n\
L_Font"jump opr"NextRow: \n\
movl %3,%%ecx \n\
L_Font"jump opr"ReadBits: \n\
lodsb \n\
stc \n\
adcb %%al,%%al \n\
L_Font"jump opr"Loop: \n\
"jump" L_Font"jump opr"NoSet \n\
"opr"b %%dl,(%%edi) \n\
L_Font"jump opr"NoSet: \n\
incl %%edi \n\
addb %%al,%%al \n\
loopnz L_Font"jump opr"Loop \n\
orl %%ecx,%%ecx \n\
jnz L_Font"jump opr"ReadBits \n\
addl %1,%%edi \n\
decl %%ebx \n\
jnz L_Font"jump opr"NextRow "\
: /* NOTHING */ \
: "g" (dst), "g" (offs), "g" (bits), \
"g" (wdt), "g" (hgt), "g" (color) \
: "di", "si", "dx", "cx", "bx", "ax" \
)
#define __WFSET__ "stosb"
#define __WFXOR__ "xorb %%al,(%%edi); incl %%edi"
#define __WFOR__ "orb %%al,(%%edi); incl %%edi"
#define __WFAND__ "andb %%al,(%%edi); incl %%edi"
#define _WriteFont(dp,o,bp,w,h,cls) __WRTFONT__(dp,o,bp,w,h,cls,__WFSET__)
#define _WriteFontXor(dp,o,bp,w,h,cls) __WRTFONT__(dp,o,bp,w,h,cls,__WFXOR__)
#define _WriteFontOr(dp,o,bp,w,h,cls) __WRTFONT__(dp,o,bp,w,h,cls,__WFOR__)
#define _WriteFontAnd(dp,o,bp,w,h,cls) __WRTFONT__(dp,o,bp,w,h,cls,__WFAND__)
#define _WrFGCFont(dp,o,bp,w,h,fg) __WR1CFNT__(dp,o,bp,w,h,fg,"jnc","mov")
#define _WrFGCFontXor(dp,o,bp,w,h,fg) __WR1CFNT__(dp,o,bp,w,h,fg,"jnc","xor")
#define _WrFGCFontOr(dp,o,bp,w,h,fg) __WR1CFNT__(dp,o,bp,w,h,fg,"jnc","or")
#define _WrFGCFontAnd(dp,o,bp,w,h,fg) __WR1CFNT__(dp,o,bp,w,h,fg,"jnc","and")
#define _WrBGCFont(dp,o,bp,w,h,bg) __WR1CFNT__(dp,o,bp,w,h,bg,"jc","mov")
#define _WrBGCFontXor(dp,o,bp,w,h,bg) __WR1CFNT__(dp,o,bp,w,h,bg,"jc","xor")
#define _WrBGCFontOr(dp,o,bp,w,h,bg) __WR1CFNT__(dp,o,bp,w,h,bg,"jc","or")
#define _WrBGCFontAnd(dp,o,bp,w,h,bg) __WR1CFNT__(dp,o,bp,w,h,bg,"jc","and")
/*
* set a bitmap patterned row
*/
#define __PTNROW__(dst,maskpatt,width,colors,putbyte) _ASV(" \n\
movl %0,%%edi \n\
movl %1,%%edx \n\
movl %2,%%ecx \n\
movl %3,%%ebx \n\
L_Patt"#putbyte"Loop: \n\
rolb $1,%%dl \n\
sbbb %%al,%%al \n\
andb %%bh,%%al \n\
xorb %%bl,%%al \n\
"putbyte" \n\
loop L_Patt"#putbyte"Loop "\
: /* NOTHING */ \
: "g" (dst), "g" (maskpatt), "g" (width), "g" (colors) \
: "di", "dx", "cx", "bx", "ax" \
)
/*
* set a bitmap patterned row, foreground or background only
*/
#define __P1CROW__(dst,maskpatt,width,color,jump,opr) _ASV(" \n\
movl %0,%%edi \n\
movl %1,%%edx \n\
movl %2,%%ecx \n\
movl %3,%%eax \n\
L_Patt"jump opr"Loop: \n\
rolb $1,%%dl \n\
"jump" L_Patt"jump opr"NoSet \n\
"opr"b %%al,(%%edi) \n\
L_Patt"jump opr"NoSet: \n\
incl %%edi \n\
loop L_Patt"jump opr"Loop \n\
L_Patt"jump opr"End: "\
: /* NOTHING */ \
: "g" (dst), "g" (maskpatt), "g" (width), "g" (color) \
: "di", "dx", "cx", "ax" \
)
#define _PatternSet(dst,msk,wdt,cls) __PTNROW__(dst,msk,wdt,cls,__WFSET__)
#define _PatternXor(dst,msk,wdt,cls) __PTNROW__(dst,msk,wdt,cls,__WFXOR__)
#define _PatternOr(dst,msk,wdt,cls) __PTNROW__(dst,msk,wdt,cls,__WFOR__)
#define _PatternAnd(dst,msk,wdt,cls) __PTNROW__(dst,msk,wdt,cls,__WFAND__)
#define _PattFGCSet(dst,msk,wdt,fg) __P1CROW__(dst,msk,wdt,fg,"jnc","mov")
#define _PattFGCXor(dst,msk,wdt,fg) __P1CROW__(dst,msk,wdt,fg,"jnc","xor")
#define _PattFGCOr(dst,msk,wdt,fg) __P1CROW__(dst,msk,wdt,fg,"jnc","or")
#define _PattFGCAnd(dst,msk,wdt,fg) __P1CROW__(dst,msk,wdt,fg,"jnc","and")
#define _PattBGCSet(dst,msk,wdt,bg) __P1CROW__(dst,msk,wdt,bg,"jc","mov")
#define _PattBGCXor(dst,msk,wdt,bg) __P1CROW__(dst,msk,wdt,bg,"jc","xor")
#define _PattBGCOr(dst,msk,wdt,bg) __P1CROW__(dst,msk,wdt,bg,"jc","or")
#define _PattBGCAnd(dst,msk,wdt,bg) __P1CROW__(dst,msk,wdt,bg,"jc","and")
/*
* X major line drawing
*/
#define __XLINE__(dst,offs,deltx,delty,color,putbyte) _ASV(" \n\
movl %0,%%edi \n\
movl %1,%%esi \n\
movl %2,%%ecx \n\
movl %3,%%ebx \n\
movl %4,%%eax \n\
movl %%ecx,%%edx \n\
shrl $1,%%edx \n\
incl %%ecx \n\
L_LineX"#putbyte"Loop: \n\
"putbyte" \n\
subl %%ebx,%%edx \n\
jnc L_LineX"#putbyte"NoAdjust \n\
addl %2,%%edx \n\
addl %%esi,%%edi \n\
L_LineX"#putbyte"NoAdjust: \n\
loop L_LineX"#putbyte"Loop "\
: /* NOTHING */ \
: "g" (dst), "g" (offs), "g" (deltx), "g" (delty), "g" (color) \
: "di", "si", "dx", "cx", "bx", "ax" \
)
#define __XLSET__ "stosb"
#define __XLXOR__ "xorb %%al,(%%edi); incl %%edi"
#define __XLOR__ "orb %%al,(%%edi); incl %%edi"
#define __XLAND__ "andb %%al,(%%edi); incl %%edi"
#define _DrawXLine(dp,do,dx,dy,c) __XLINE__(dp,do,dx,dy,c,__XLSET__)
#define _DrawXLineXor(dp,do,dx,dy,c) __XLINE__(dp,do,dx,dy,c,__XLXOR__)
#define _DrawXLineOr(dp,do,dx,dy,c) __XLINE__(dp,do,dx,dy,c,__XLOR__)
#define _DrawXLineAnd(dp,do,dx,dy,c) __XLINE__(dp,do,dx,dy,c,__XLAND__)
/*
* Y major line drawing
*/
#define __YLINE__(dst,offs,deltx,delty,color,putbyte) _ASV(" \n\
movl %0,%%edi \n\
movl %1,%%esi \n\
movl %3,%%ecx \n\
movl %2,%%ebx \n\
movl %4,%%eax \n\
movl %%ecx,%%edx \n\
shrl $1,%%edx \n\
incl %%ecx \n\
L_LineY"#putbyte"Loop: \n\
"putbyte" \n\
addl %%esi,%%edi \n\
subl %%ebx,%%edx \n\
jnc L_LineY"#putbyte"NoAdjust \n\
addl %3,%%edx \n\
incl %%edi \n\
L_LineY"#putbyte"NoAdjust: \n\
loop L_LineY"#putbyte"Loop "\
: /* NOTHING */ \
: "g" (dst), "g" (offs), "g" (deltx), "g" (delty), "g" (color) \
: "di", "si", "dx", "cx", "bx", "ax" \
)
#define __YLSET__ "movb %%al,(%%edi)"
#define __YLXOR__ "xorb %%al,(%%edi)"
#define __YLOR__ "orb %%al,(%%edi)"
#define __YLAND__ "andb %%al,(%%edi)"
#define _DrawYLine(dp,do,dx,dy,c) __YLINE__(dp,do,dx,dy,c,__YLSET__)
#define _DrawYLineXor(dp,do,dx,dy,c) __YLINE__(dp,do,dx,dy,c,__YLXOR__)
#define _DrawYLineOr(dp,do,dx,dy,c) __YLINE__(dp,do,dx,dy,c,__YLOR__)
#define _DrawYLineAnd(dp,do,dx,dy,c) __YLINE__(dp,do,dx,dy,c,__YLAND__)
#endif /* __GNUC__ */
#endif /* whole file */